import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;

/**
 * Classe de utilidades.
 * @author gabriel.soares3
 */
public class Util {

	/**
	 * Copia uma Matrix.
	 * @param matrix Matriz a ser copiada.
	 * @return Copia desta Matriz.
	 */
    public static int[][] copiaMatrix(int[][] matrix){

        int[][] retorna = new int[matrix.length][matrix[0].length];

        for (int i = 0; i < matrix.length; i++){
            for(int j = 0; j < matrix[i].length; j++){
                retorna[i][j] = matrix[i][j];
            }
        }

        return retorna;

    }

    
    /**
     * Desenha a Matriz na Console.
     * @param matrix Matriz a ser desenhada.
     */
    public static void desenhaMatrix(int[][] matrix){

        for (int i = 0; i < matrix.length; i++){
            for (int j = 0; j < matrix[i].length; j++){
                System.out.print("\t" + matrix[i][j]);
            }
            System.out.println();
        }
    }

    /**
     *  Desenha a Tela com a Matriz que foi passada.
     * @param matrix Matriz com os dados.
     * @param xrobo Posicao em X do Robo.
     * @param yrobo Posicao em Y do Robo.
     * @param tela A Tela para desenho.
     */
    public static void desenhaEsquema(int[][] matrix, int xrobo, int yrobo, final Tela tela, final EstadoAspirador estadoAtual){
    	
    	int robo = 0, sujo = 0;
    	
    	tela.getContentPane().removeAll();
    	    	
    	GridLayout novoGrid = new GridLayout(matrix.length + 1, matrix[0].length + 1);
    	tela.setLayout(novoGrid);
    	
		for (int j = 0; j < matrix[0].length; j++){
    		for(int i = 0; i < matrix.length; i++){
    			if (matrix[i][j] == 0)
    			{
    				sujo = 0;
    				
    				if(xrobo == i && yrobo == j)
    					robo = 1;
    			}
    			else
    			{
    				sujo = 1;
    				if(xrobo == i && yrobo == j)
    					robo = 1;    				
    			}
    			
    			ImageIcon icone = new ImageIcon(Util.retornaImagem(sujo, robo));
    			JLabel l1 = new JLabel(icone);
    			tela.add(l1);
    			sujo = 0;
    			robo = 0;
    		}
    	}
		
		
		// Adiciona o Combo com as opcoes possiveis.
		final JComboBox<Acao> novoCombo = new JComboBox<Acao>(); 
		novoCombo.setSize(200, 500);
		for(Acao o : estadoAtual.acoesPossiveis()){

			novoCombo.addItem(o);
		}
		tela.add(novoCombo);
		
		
		JButton novoBotao = new JButton();
		novoBotao.setText("Executa Acao");
		novoBotao.addActionListener(new ActionListener(){
			
			public void actionPerformed(ActionEvent e){
				EstadoAspirador novoEstado = estadoAtual.executaAcao((Acao)novoCombo.getSelectedItem());
				Util.desenhaEsquema(novoEstado.estado, novoEstado.roboX, novoEstado.roboY, tela, novoEstado);
			}
			
		});
		JButton outroBotao = new JButton();
		outroBotao.setText("Resolve");
		outroBotao.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				
				ArrayList<EstadoAspirador> estadoFinal = estadoAtual.resolveAspirador();
		        
		        for(EstadoAspirador checa : estadoFinal){
		        	Util.desenhaEsquema(checa.estado, checa.roboX, checa.roboY, tela, estadoAtual);
		        	JOptionPane.showMessageDialog(tela, "Proximo Passo !");
		        }
		        
		        estadoAtual.estado = Util.copiaMatrix(estadoFinal.get(estadoFinal.size()-1).estado);
		        estadoAtual.roboX = estadoFinal.get(estadoFinal.size()-1).roboX;
		        estadoAtual.roboY = estadoFinal.get(estadoFinal.size()-1).roboY;
		        
		        JOptionPane.showMessageDialog(null, "Resolvido !");
		        
		        Util.desenhaEsquema(estadoAtual.estado, estadoAtual.roboX, estadoAtual.roboY, tela, estadoAtual);
		        }
			
		});
		
		tela.add(novoBotao);
		tela.add(outroBotao);
		tela.pack();
    }

    /**
     * Retorna a imagem correspondente do Robo.
     * @param sujo Se tem Lixo.
     * @param robo Se tem Robo.
     * @return Caminho para a Imagem.
     */
    public static String retornaImagem(int sujo, int robo){
    	String retorno = null;
    	
    	if (sujo == 1 && robo == 1)
    		retorno = "src\\Image\\lixo Robo.JPG";
    	
    	if (sujo == 1 && robo == 0)
    		retorno = "src\\Image\\lixo.jpg";
    	
    	if (sujo == 0 && robo == 1)
    		retorno = "src\\Image\\Robo.JPG";
    	
    	if (sujo == 0 && robo == 0)
    		retorno = "src\\Image\\blank.JPG";
    	
    	return retorno;
    }
}